// scala if for 练习
object ifAndForPractice {
  def main(args: Array[String]): Unit = {
    //If
    /*Scala中的if表达式的结果始终为Unit。
    if/else的结果基于表达式的每个部分的类型。*/
    val exp = true
    if (exp) {
      println("true1")
      println("true2")
    }
    //Scala中的if/else在Java中的行为类似于三元运算符：
    val o: Int = if (exp) 1 else 3
    //并且表达式的任一（或两者）部分可以具有如下面代码中所示的多行代码块。
    val i: Int = if (exp)
      1
    else {
      val j = System.currentTimeMillis
      (j % 100L).toInt
    }

    //for
    //提供了迭代集合的能力，它还提供过滤选项和生成新集合的能力。
    val dogBreeds = List("A", "B", "C", "D", "E")
    for (breed <- dogBreeds)
      println(breed)
    //左箭头操作符称为生成器，因为它从表达式中使用的集合生成相应的值。
    //生成器表达式
    /*表达式breed <- dogBreeds称为生成器表达式，因此命名是因为它从集合中生成单个值。
    左箭头运算符（< - ）用于遍历一个集合，例如List。
    我们还可以使用它与范围来写一个更传统的寻找循环：*/
    for(i <- 1 to 10) println(i)

    /*约束: 过滤值
    我们可以添加if表达式来过滤我们想要保留的元素。
    这些表达式称为约束。
    要找到我们的狗品种列表中的所有D，我们修改前面的例子如下：*/
    val dogBreeds1 = List("D", "Y", "D", "S", "G", "P")
    for (breed <- dogBreeds1
         if breed.contains("D")
    ) println(breed)


    val dogBreeds2 = List("D", "Y", "D", "S", "G", "P")

    for (breed <- dogBreeds2
         if breed.contains("D")
         if  !breed.startsWith("Y")
    ) println(breed)

    for (breed <- dogBreeds2
         if breed.contains("D") &&  !breed.startsWith("Y")
    ) println(breed)

    /*过滤器是for表达式中的if子句，用于过滤集合，当我们不想遍历整个集合时。
    以下代码显示如何在我们的书籍列表中查找所有Scala图书。*/
    val books = List("Scala", "Groovy", "Java", "SQL", "CSS")
    for(book<-books
        if book.contains("Scala")
    ) println(book)

    /*可变绑定
    我们可以为表达式定义变量。
    然后我们可以在你的for表达式的正文中重用这些变量。*/
    val books2 = List("Scala", "Groovy", "Java", "SQL", "CSS")
    for {
      book <- books2
      bookVal = book.toUpperCase()
      //bookVal没有声明为val，但是你仍然可以重用它。
    } println(bookVal)

    /*Yielding
    在Scala的for表达式中，我们可以使用yield关键字来生成新的集合。
    从for表达式生成的集合的类型从迭代的集合的类型推断。
    要在for循环中将值赋给我们的程序的另一部分，请使用yield关键字为表达式生成新的集合。*/
    val dogBreeds3 = List("D", "Y", "D", "S", "G", "P")
    val filteredBreeds = for {
      breed <- dogBreeds3
      if breed.contains("T") &&  !breed.startsWith("Y")
    } yield breed

    //对集合使用yield。
    val books4 = List("Scala", "Groovy", "Java", "SQL", "CSS")
    var scalabooks = for{
      book <-books4
      if book.contains("Scala")
    }yield book
    println(scalabooks)
    /*过滤的结果作为名为book的值生成。
    这个结果是在for循环中每次运行时累积的，因此累积的集合被分配给值scalabooks。
    scalabook是List [String]类型，因为它是图书列表的一个子集，也是List [String]类型。*/

    /*扩展范围和值定义
    用于解释的Scala可以在for表达式的第一部分中定义可用于后面表达式的值，如下例所示：*/
    val dogBreeds5 = List("D", "Y", "D", "S", "G", "P")
    for {
      breed <- dogBreeds5
      upcasedBreed = breed.toUpperCase()
    } println(upcasedBreed)


  }
}
